package studio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import studio.excepcion.DAOExcepcion;
import studio.modelo.Instrumento;
import studio.modelo.Servicio;
import studio.modelo.TipoRecurso;
import studio.util.ConexionBD;

public class InstrumentoDao extends BaseDAO {

	
	public int insertarIntrumento(Instrumento objInstrumento) throws DAOExcepcion
	{
		System.out.println("InstrumentoDAO: insertar(Istrumento objInstrumento)");
		String query = "insert into instrumento(Tipo_idTipo,marca_idmarca,Modelo_idModelo,caracteristica,stockTot,cantSeparada,costoxHora,nroSerie) values (?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		int idNroArmado=0;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1,objInstrumento.objTipIntru.getIdTipo());
			stmt.setInt(2,objInstrumento.objmarca.getIdMarca());
			stmt.setInt(3,objInstrumento.objModelo.getIdModelo());
			stmt.setString(4, objInstrumento.getCaracteristicas());
			stmt.setInt(5,objInstrumento.getStockTot());
			stmt.setInt(6,objInstrumento.getCantSeparada());
			stmt.setDouble(7, objInstrumento.getCostoxHora());
			stmt.setString(8,objInstrumento.getNroSerie());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			else
			{
				String ConsultarIdGenerado="SELECT LAST_INSERT_ID()";
				stmt=con.prepareStatement(ConsultarIdGenerado);
				rs=stmt.executeQuery();
				if(rs.next())
				{
					idNroArmado=rs.getInt(1);
				}
				javax.swing.JOptionPane.showMessageDialog(null, "Instrumento Grabado Correctamente","Studio 7i",1);
				System.out.println("Instrumento Registrado Correctamente");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return idNroArmado;
	}
	
	/*
	 * UPDATE `studio7i`.`instrumento` SET `Tipo_idTipo`=2, `marca_idmarca`=2, `caracteristica`='Guitarra Electrica 2', `stockTot`=2, `cantSeparada`=1, `costoxHora`=20.5, `nroSerie`='GRT0001' WHERE `idInstrumento`='3';
	 * */
	public int actualizarIntrumento(Instrumento objInstrumento) throws DAOExcepcion
	{
		System.out.println("InstrumentoDAO: actualizar(Istrumento objInstrumento)");
		String query ="UPDATE instrumento SET Tipo_idTipo=?,marca_idmarca=?,Modelo_idModelo=?,caracteristica=?,stockTot=?,costoxHora=?,nroSerie=? "+
		" WHERE idInstrumento=?"; 
	//"insert into instrumento(Tipo_idTipo,marca_idmarca,Modelo_idModelo,caracteristica,stockTot,cantSeparada,costoxHora,nroSerie) values (?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		int i=0;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1,objInstrumento.objTipIntru.getIdTipo());
			stmt.setInt(2,objInstrumento.objmarca.getIdMarca());
			stmt.setInt(3,objInstrumento.objModelo.getIdModelo());
			stmt.setString(4, objInstrumento.getCaracteristicas());
			stmt.setInt(5,objInstrumento.getStockTot());
			stmt.setDouble(6, objInstrumento.getCostoxHora());
			stmt.setString(7,objInstrumento.getNroSerie());
			stmt.setInt(8,objInstrumento.getIdInstrumento());
			i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			else
			{
				javax.swing.JOptionPane.showMessageDialog(null, "Instrumento Actualizado Correctamente","Studio 7i",1);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return i;
	}
	
	public Instrumento RetornarIntrumento(int idInstru) throws DAOExcepcion {
		System.out.println("SalaDAO: RetornarIntrumento(int idIntru)");
		Instrumento objInstr = new Instrumento();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select t1.idInstrumento,t1.Tipo_idTipo,t2.descripcion as DescTipo,t1.marca_idmarca,t3.descripcion as DescMarca,t1.Modelo_idModelo,t4.descripcion as DescModelo" +
			",t1.caracteristica,t1.stockTot,t1.cantSeparada,t1.costoxHora,t1.nroserie FROM instrumento t1 inner join TipoInstrumento t2" +
			" on t1.Tipo_idTipo=t2.idTipo inner join marca t3 on t1.marca_idmarca=t3.idmarca inner join modelo t4" +
			" on t1.Modelo_idModelo=t4.idmodelo  where t1.idinstrumento=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1,  idInstru);
			rs = stmt.executeQuery();
			if (rs.next()) {
				objInstr.setIdInstrumento(rs.getInt("idInstrumento"));
				objInstr.objTipIntru.setIdTipo(rs.getInt("Tipo_idTipo"));
				objInstr.objTipIntru.setDescripcion(rs.getString("DescTipo"));
				objInstr.objmarca.setIdMarca(rs.getInt("marca_idmarca"));
				objInstr.objmarca.setDescripcion(rs.getString("DescMarca"));
				objInstr.objModelo.setIdModelo(rs.getInt("Modelo_idModelo"));
				objInstr.objModelo.setDescripcion(rs.getString("DescModelo"));
				objInstr.setCaracteristicas(rs.getString("caracteristica"));
				objInstr.setStockTot(rs.getInt("stockTot"));
				objInstr.setCostoxHora(rs.getDouble("costoxHora"));
				objInstr.setCantSeparada(rs.getInt("cantSeparada"));
				objInstr.setNroSerie(rs.getString("nroserie"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objInstr;
	}
	
	public Collection<Instrumento> ListaoIntrumento() throws DAOExcepcion {
		System.out.println("SalaDAO: ListadoIntrumento()");
		Collection<Instrumento> listaInstrumento = new ArrayList<Instrumento>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select t1.idInstrumento,t1.Tipo_idTipo,t2.descripcion as DescTipo,t1.marca_idmarca,t3.descripcion as DescMarca,t1.Modelo_idModelo,t4.descripcion as DescModelo" +
			",t1.caracteristica,t1.stockTot,t1.cantSeparada,t1.costoxHora,t1.nroserie FROM instrumento t1 inner join TipoInstrumento t2" +
			" on t1.Tipo_idTipo=t2.idTipo inner join marca t3 on t1.marca_idmarca=t3.idmarca inner join modelo t4" +
			" on t1.Modelo_idModelo=t4.idmodelo";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Instrumento objInstr = new Instrumento();
				objInstr.setIdInstrumento(rs.getInt("idInstrumento"));
				objInstr.objTipIntru.setIdTipo(rs.getInt("Tipo_idTipo"));
				objInstr.objTipIntru.setDescripcion(rs.getString("DescTipo"));
				objInstr.objmarca.setIdMarca(rs.getInt("marca_idmarca"));
				objInstr.objmarca.setDescripcion(rs.getString("DescMarca"));
				objInstr.objModelo.setIdModelo(rs.getInt("Modelo_idModelo"));
				objInstr.objModelo.setDescripcion(rs.getString("DescModelo"));
				objInstr.setCaracteristicas(rs.getString("caracteristica"));
				objInstr.setStockTot(rs.getInt("stockTot"));
				objInstr.setCostoxHora(rs.getDouble("costoxHora"));
				objInstr.setCantSeparada(rs.getInt("cantSeparada"));
				objInstr.setNroSerie(rs.getString("nroserie"));
				listaInstrumento.add(objInstr);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return listaInstrumento;
	}
	
	
	
	
	//select idTipoRecurso,descripcion from TipoRecurso;
	public TipoRecurso RetornarTipoRecurso(int idRecu) throws DAOExcepcion {
		System.out.println("SalaDAO: RetornarTiporecurso(int idRecurs)");
		TipoRecurso objRecur = new TipoRecurso();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idTipoRecurso,descripcion from TipoRecurso where idTipoRecurso=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1,  idRecu);
			rs = stmt.executeQuery();
			if (rs.next()) {
				objRecur.setIdTipoRecurso(rs.getInt("idTipoRecurso"));
				objRecur.setDescripcion(rs.getString("descripcion"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objRecur;
	}
	
	public Collection<TipoRecurso> ListarTipoRecurso() throws DAOExcepcion {
		System.out.println("SalaDAO: ListarTipoRecurso()");
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Collection<TipoRecurso>Lst=new ArrayList<TipoRecurso>();
		try {
			String query = "select idTipoRecurso,descripcion from TipoRecurso where idTipoRecurso";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				TipoRecurso objRecur = new TipoRecurso();
				objRecur.setIdTipoRecurso(rs.getInt("idTipoRecurso"));
				objRecur.setDescripcion(rs.getString("descripcion"));
				Lst.add(objRecur);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return Lst;
	}
	
	
	public Servicio RetornarServicio(int id) throws DAOExcepcion {
		
		String query = "SELECT idServicio, descripcionServicio, costoxHora FROM Servicio where idservicio=?";
		Servicio vo = new Servicio();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdServicio(rs.getInt("idServicio"));
				vo.setDescripcionServicio(rs.getString("descripcionServicio"));
				vo.setCostoxHora(rs.getDouble("costoxHora"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
//
	
	
	public boolean ValidarSerieDuplicada(Instrumento objInstru) throws DAOExcepcion 
	{
		boolean valor=true;
		System.out.println("InstrumentoDao: ValidarSerieDuplicado()");
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select count(*) as Nro from Instrumento where nroSerie=?";
			stmt = con.prepareStatement(query);
			//System.out.println(objSala.getNombreSala());
			stmt.setString(1,objInstru.getNroSerie());
			rs = stmt.executeQuery();
			rs.first();
			int Nro=rs.getInt("Nro");
			System.out.println(Nro);
			if (Nro>0)
			{
				valor=false;
			}
			else
			{
				valor=true;
			}
			
		} catch (SQLException e) 
		{
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return valor;
	}
}